#ifndef __LIST_H__
#define __LIST_H__

// 数据结点
struct node_st {
// 	void *data; // 数据域
	struct node_st *next; // 指针域
	char data[0];
};

// 头结点
typedef struct {
// 	struct node_st *next;
	struct node_st head; // head.data什么都不放 head.next指向第一个数据结点的地址
	// 好处就是头结点的地址可以是listhead_t *也可以表达为首元素的地址, 类型就是struct node_st *
	int size; // 数据域大小
	int numbers; // 数据结点的个数
}listhead_t;

typedef int (*cmp_t)(const void *data, const void *key);
typedef void (*pri_t)(const void *data);

// API
// 初始化头结点
int listhead_init(listhead_t **mylist, int size);

// 增
// 头插 新的结点作为第一个数据结点
int list_insert(listhead_t *mylist, const void *data);

// 尾插 新结点作为最后一个数据结点
int list_insert_tail(listhead_t *mylist, const void *data);

// 空
int list_empty(const listhead_t *mylist);

// 删除
int list_delete(listhead_t *mylist, const void *key, cmp_t cmp);

// 查
void *list_search(const listhead_t *mylist, const void *key, cmp_t cmp);

// 遍历
void list_traval(const listhead_t *mylist, pri_t pri);

// 销毁
void list_destroy(listhead_t **mylist);

/*
 	链表的转置
		原链表--->实现的
		生成一个新的链表
 */
//void list_reverse(listhead_t *mylist);

// 中间结点
void *list_mid_node(const listhead_t *mylist);

// 判断是否有环
int list_cycle(const listhead_t *mylist);

// 入口
void *list_enter(const listhead_t *mylist);

#endif


